package com.study.ktandroid.kt_use_skills

import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.os.Bundle
import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import androidx.fragment.app.Fragment
import com.study.ktandroid.databinding.ActivityFuncBinding
import java.lang.IllegalArgumentException

/**
 * 高阶函数应用
 */
class HigherOrderFuncActivity : AppCompatActivity() {

    lateinit var binding: ActivityFuncBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityFuncBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // useSp()
    }

    // 官方sharedPreference扩展
    private fun useSp() {
        // 官方扩展 SP
        getPreferences(Context.MODE_PRIVATE).edit {
            putString("name", "slx")
        }

        val name = getPreferences(Context.MODE_PRIVATE).getString("name", "")
        binding.tvSp1.text = name

        // 使用自己的sp扩展
        getPreferences(Context.MODE_PRIVATE).modify {
            putString("address", "青岛")
        }
        binding.tvSp2.text = getPreferences(Context.MODE_PRIVATE).getString("address", "")
    }

    // 模仿官方扩展sp
    // block应该是sp.edit的扩展，因为putXxx需要上下文环境，如果不写扩展默认为当前Activity的上下文
    fun SharedPreferences.modify(block: SharedPreferences.Editor.() -> Unit) {
        // 初始化edit
        val edit = edit()
        edit.block() // 执行外部传入的block函数，相当于putXxx操作
        edit.apply()
    }
}

// apply函数应用 接收参数为this，返回自身
class MyFragment : Fragment() {
    fun newInstance(args: Bundle): MyFragment {
        val fragment = MyFragment()
        fragment.arguments = args
        return fragment
    }

    // 使用apply改进
    fun newInstance2(args: Bundle) = MyFragment()
            .apply {
                arguments = args
            }


    fun createIntent(intentAtion: String, intentData: String): Intent {
        val intent = Intent()
        intent.action = intentAtion
        intent.data = Uri.parse(intentData)
        return intent
    }

    // 使用apply改进
    fun createIntent2(intentAction: String, intentData: String): Intent = Intent()
            .apply { action = intentAction }
            .apply { data = Uri.parse(intentData) }
}